#pragma once

//对条件变量的封装
#include<iostream>
#include<pthread.h>
#include<unistd.h>

class Cond
{  
public:
    Cond()
    {
        //构造时初始化
        pthread_cond_init(&_cond ,nullptr);
    }
    //等待，条件不满足的时候就到阻塞在此条件变量下，即在该条件变量下等待
    void Wait(Mutex &lock)
    {
        pthread_cond_wait(&_cond ,lock.Get());//需要传递锁
        //这是因为一定是在临界区进入条件变量的等待队列中，此时需要解锁，当条件满足后再重新申请锁
    }
    //唤醒，唤醒条件变量等待队列中的一个线程以及唤醒所有线程
    void NotifyOne()
    {
        pthread_cond_signal(&_cond);
    }
    void NotifyAll()
    {
        pthread_cond_broadcast(&_cond);
    }
    ~Cond()
    {
        //析构时销毁
        pthread_cond_destroy(&_cond);
    }
private:
    pthread_cond_t _cond;
};